Taller de verano: Introducción a Python - Parte 3

Python Logo

4. Colecciones


Las colecciones son tipos de datos que permiten almacenar múltiples valores en una misma variable. Las distintas maneras en que se organizan estos datos para su lectura y escritura se conocen como estructuras de datos. Python tiene 3 estructuras definidas como primitivas por defecto del lenguaje, que pueden ser definidas con sintaxis especial.

Una colección de datos en programación almacena 2 o más elementos en un arreglo con distintos números de índex, por lo que nos ayuda a agrupar elementos que tengan algo que ver unos con los otros. Existen cuatro tipos de colecciones de datos en el lenguaje Python:

  • Lista: es una colección ordenada y modificable. Permite datos duplicados.
  • Tupla: es una colección ordenada e inmutable. Permite datos duplicados.
  • Set: es una colección que no posee un órden ni un índex. No existen datos duplicados.
  • Dictionary: es una colección sin orden, modificable e indexada. No permite datos duplicados.

## 4.1 Listas

Las listas son el tipo de colección más común. Son estructuras de datos ordenadas con longitud variable. Esto quiere decir, que tras su declaración se pueden agregar o eliminar elementos específicos de su contenido. Además, estos elementos ocupan una posición definida secuencialmente, siendo el primer elemento el que ocupa la posición 0.

Existen dos formas de declarar listas en Python: * Con llaves cuadradas.    Ejemplo: l = [] * Con la función list.      Ejemplo: l = list()

En el momento de su definición, se pueden definir valores por defecto, separados por coma.

l = [1, 'Hola', 4.5]
print(l)
type(l)
[1, 'Hola', 4.5]
list

Las listas en Python son:

  • Heterogéneas: Pueden estar conformadas por elementos de distintos tipo, incluyendo otras listas.
  • Mutables: Sus elementos pueden modificarse.
l = [1, 2.5, [4, 5, 6, 7], "Fin"]
print(l)
type(l)
[1, 2.5, [4, 5, 6, 7], 'Fin']
list

Los elementos de una lista pueden accederse mediante su índice, siendo 0 el índice del primer elemento.

print(l[1])
Hola

Se pueden realizar operaciones entre listas mediante algunos operadores. Es importante tener en cuenta los tipos de dato, pues símbolos como estos funcionan de manera distinta en relación al tipo de dato que manejan. Estos operadores básicos son:

  • Concatenación +: Al aplicar este operador, se agregan los elementos de la segunda lista al final de la primera.
  • Repetición *: Al aplicar este operador, se repiten los elementos la cantidad de veces expresada en el segundo operando.
l_a = [1, 2, 3]
l_b = ['a', 'b', 'c']
# Concatenar
# Repetición

Algunos comandos de la lista de metodos:

Métodos Descripción
append(elemento) agregar elemento al final de la lista
extend(lis2) Extiende la lista con los elementos de la lista 2
index(element) Devuelve el índice más bajo de la lista que contiene el elemento.
insert(index,element) Inserta un elemento para el indice index
pop(i) Elimina y retorna el elemento en la posición i
reverse(element) Invierte la lista de lugar
remove(element) Elimina la primera aparición del elemento de la lista
sort() Clasifica la lista en lugar
copy() Retorna la copia de la lista
count(element) Retorna el némero de elementos igual al elemento de la lista

Utilizar los metodos:

Interando listas

lista = ["manzana", "banana", "cereza"]
for x in lista:
  print(x)
manzana
banana
cereza

4.2 Tuplas


Son similares a las listas, pero lo que las diferencia es que estas son inmutables, esto quiere decir que no puede modificarse de ninguna forma después de que sean creadas. Los elementos de tupla están ordenados y permiten valores duplicados. Las tuplas se pueden definir de dos formas:

tupla = (1,2,3,4)

# También de esta forma

tupla = tuple((1, 2, 3, 4))

Para acceder a un valor dada una posición se realiza igual que con las listas, se escribe el nombre de la tupla seguido de apertura de corchetes, posición que buscamos y cierre de corchetes.

tupla = tuple((1,2,3, 'r'))
print(tupla[1])
2

Se pueden recorrer los elementos de una tupla con for:

for dato in tupla:
    print(dato, end=" ")
1 2 3 r 

Funciones de las tuplas:

Longitud de una tupla

tup = (1,2,13,-50)
len(tup)
4

Máximo de una tupla

tup = (1,2,13,-50)
max(tup)
13

Minimo de una tupla

tup = (1,2,13,-50)
min(tup)
-50

## 4.3 Set

Los conjuntos se utilizan para almacenar varios elementos en una sola variable. Un conjunto es una colección desordenada , inmutable* y no indexada.

Nota: Los elementos establecidos no se pueden modificar, pero puede eliminar elementos y agregar elementos nuevos.

vocales = {'a', 'e', 'i', 'o', 'u', 'a', 'a', 'o', 'e'}
print(vocales)

Dado que los conjuntos son colecciones desordenadas, en ellos no se guarda la posición en la que son insertados los elementos como ocurre en los tipos lista o tuplas. Es por ello que no se puede acceder a los elementos a través de un índice.

Sin embargo, haciendo uso de un bucle for se puede acceder y/o recorrer todos los elementos del conjunto.

print(vocales{2})
SyntaxError: invalid syntax (Temp/ipykernel_1032/3960885320.py, line 3)
for e in vocales:
    print(e)
u
a
e
i
o

Metodos para utilizar en conjuntos.

Agregar elementos

Una vez que se crea un conjunto, no puede cambiar sus elementos, pero puede agregar nuevos elementos. Para agregar un elemento a un conjunto, utilice el método add().

conjunto = {"manzana", "cereza", "fresa"}

conjunto.add("mango")

print(conjunto)
{'manzana', 'cereza', 'mango', 'fresa'}

Agregar conjuntos

Para agregar elementos de otro conjunto al conjunto actual, utilice el método update(), se puede tomar como argumento una lista, tupla, string, conjunto o cualquier objeto de tipo iterable.

conjunto = {"manzana", "cereza", "fresa"}
lista = ["kiwi", "naranja"]

conjunto.update(lista)

print(conjunto)
{'fresa', 'manzana', 'naranja', 'cereza', 'kiwi'}

Algunos comandos de la lista de metodos:

Métodos Descripción
add() Añade un elemento
clear() Remueve todos los elementos
copy() Entrega una copia del set
difference() Entrega un set conteniendo los miembros diferentes entre dos o más sets
difference_update() Remueve los elementos en este set que también se incluyen en otro set específico
discard() Elimina, si existe, el elemento del conjunto.
intersection() Entrega un set, que es la intersección de otros dos sets
intersec_update() Remueve los elementos en este set que no se encuentran presentes en otro set específico.
isdisjoint() Entrega si dos sets tienen una intersección o no
issubset() Entrega si otro set contiene este set o no
issuperset() Entrega si este set contiene otro set o no
pop() Obtiene y elimina un elemento de forma aleatoria del conjunto
remove() Elimina el elemento del conjunto. Si no existe lanza un error.
symmetric_difference() Entrega un set con la diferencia simétrica de dos sets
union() Entrega un set que contiene la unión de dos sets
update() Actualiza el set con la unión de éste y otros sets

Unir dos conjuntos

Hay varias formas de unir dos o más conjuntos en Python.

Puede usar el método union() que devuelve un nuevo conjunto que contiene todos los elementos de ambos conjuntos, o el método update() que inserta todos los elementos de un conjunto en otro:

set1 = {"a", "b" , "c"}
set2 = {1, 2, 3}

set3 = set1.union(set2)
print(set3)
{1, 2, 'a', 3, 'b', 'c'}

El método update() inserta los elementos en set2 en set1:

set1 = {"a", "b" , "c"}
set2 = {1, 2, 3}

set1.update(set2)
print(set1)

4.4 Diccionarios


Un diccionario de Python es una estructura de datos para almacenar grupos de objetos. Consiste en un mapeo de pares clave-valor, donde cada clave está asociada a un valor. Puede contener tipos de datos iguales o diferentes, no está ordenado y es mutable.

clases = {
    "Analisis": 10,
    "Algebra": 25,
    "Fundamentos": 30,
    "Discretas": 14,
    "Multivariable": 27,
    "Etica": 35
}

print(clases,"\n")
print(clases.keys(),"\n")
print(clases.values(),"\n")
print(clases.items(),"\n")
{'Analisis': 10, 'Algebra': 25, 'Fundamentos': 30, 'Discretas': 14, 'Multivariable': 27, 'Etica': 35} 

dict_keys(['Analisis', 'Algebra', 'Fundamentos', 'Discretas', 'Multivariable', 'Etica']) 

dict_values([10, 25, 30, 14, 27, 35]) 

dict_items([('Analisis', 10), ('Algebra', 25), ('Fundamentos', 30), ('Discretas', 14), ('Multivariable', 27), ('Etica', 35)]) 

Metodos para diccionarios

Agregar un elemento

Para agregar un nuevo par de valores clave o actualizar uno existente en un diccionario de Python, puede usar el operador [ ] e ingresar la clave para actualizar o agregar y seguirlo con un = y el valor.

  • update ( ): Función dedicada para agregar o actualizar un par de valores. Toma otro diccionario como argumento, lista o tupla que representa los pares de valores clave.
  • setdefault ( ): Sirve para agregar un nuevo elemento a nuestro diccionario.
  • pop ( ): Este método remueve específicamente una clave de diccionario y devuelve su valor correspondiente. Si no lo encuentra, devuelve error.
  • popitem ( ): Este método remueve y devuelve algún par (clave, valor) del diccionario como una 2 tuplas. Lanza una excepción KeyError si el diccionario esta vació.
  • get ( ): Recibe como parámetro una clave, devuelve el valor de la clave. Si no lo encuentra, devuelve un objeto none.
  • copy ( ): Retorna una copia del diccionario original.
  • clear ( ): Elimina todos los ítems del diccionario dejándolo vacío.
  • zip ( ): Recibe como parámetro dos elementos iterables, ya sea una cadena, una lista o una tupla. Ambos parámetros deben tener el mismo número de elementos. Se devolverá un diccionario relacionando el elemento i-esimo de cada uno de los iterables.
clases = {
    "Analisis": 10,
    "Algebra": 25,
    "Fundamentos": 30,
    "Discretas": 14,
    "Multivariable": 27,
    "Etica": 35
}

# Agregar un elemento

# Eliminar un elemento

#Zip

dic = dict(zip('abcd',[1,2,3,4]))
print(dic)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

Iterando en diccionarios

# Imprime los key del diccionario
for key in clases:
    print(key)
Analisis
Algebra
Fundamentos
Discretas
Multivariable
Etica
print("Metodo 1 \n")
# Imprime los value del diccionario
for key in clases:
    print(clases[key])

print("")
print("Metodo 2 \n")
# Otro metodo
for value in clases.values():
    print(value)
Metodo 1 

10
25
30
14
27
35

Metodo 2 

10
25
30
14
27
35
# Imprime los key y value del diccionario
for x, y in clases.items():
    print(x, y)
Analisis 10
Algebra 25
Fundamentos 30
Discretas 14
Multivariable 27
Etica 35
# Diccionario con lista

grocery_items = {"eggs": [3.99, 4.99, 5.50],
                 "banana": 1.49,
                 "cheese": 4.5,
                 "eggplant": 2.5,
                "bread": 3.99}

s = grocery_items["eggs"]
print(s)
s = grocery_items["eggs"][0]
print(s)
[3.99, 4.99, 5.5]
3.99

5. Excepciones

Las excepciones en Python son una herramienta muy potente que la gran mayoría de lenguajes de programación modernos tienen. Se trata de una forma de controlar el comportamiento de un programa cuando se produce un error.

Imaginemos ahora que por cualquier motivo se quieren dividir nos variables (a/b), y que por ejemplo b tiene el valor 0. Si intentamos hacer la división entre cero, este programa dará un error y su ejecución terminará de manera abrupta.

a = 4; b = 0
print(a/b)
ZeroDivisionError: division by zero

Una primera aproximación al control de exepciones podria ser la siguiente:

a = 5
b = 0
# A través de esta comprobación prevenimos que se divida entre cero.
if b!=0:
    print(a/b)
else:
    print("No se puede dividir!")
No se puede dividir!

Sin embargo, en Python puedes usar los bloques try y except para manejar estos errores como excepciones.

try:
    # Codigo a ejecutar
    # Pero podria haber errores en este bloque
    
except <tipo de error>:
    # Haz esto para manejar la excepcion
    # El bloque except se ejecutara si el bloque try lanza un error
    
else:
    # Esto se ejecutara si el bloque try se ejecuta sin errores
   
finally:
    # Este bloque se ejecutara siempre
  • El bloque try es el bloque con las sentencias que quieres ejecutar. Sin embargo, podrían llegar a haber errores de ejecución y el bloque se dejará de ejecutarse.
  • El bloque except se ejecutará cuando el bloque try falle debido a un error. Este bloque contiene sentencias que generalmente nos dan un contexto de lo que salió mal en el bloque try. Siempre se debe mencionar el tipo de error que se espera, como una excepción dentro del bloque except en <tipo de error> ya que de esta manera se identifica el tipo de error que podria ocurrir.
  • El bloque else se ejecutará solo si el bloque try se ejecuta sin errores.
  • El bloque finally siempre es ejecutado sin importar que pase en los otros bloques, esto puede ser útil cuando quieras liberar recursos después de la ejecución de un bloque de código.

Nota: Los bloques else y finally son opcionales.

El ejemplo anterior, utilizando estos bloques quedaria de la siguiente manera:

a = 5; b = 0
try:
    c = a/b
except ZeroDivisionError:
    print("No se ha podido realizar la división")
No se ha podido realizar la división

6. Lectura de archivos

Muchas veces necesitamos que nuestros cálculos sean escritos en un archivo externo y no solamente escritos en la consola. Para ello usamos Python file.

Argumento Descripción
r Texto, leer solamente
w Texto, escribir ( si existe un archivo con el mismo nombre este lo sobreescribe)
a Texto, adjuntar el texto al archivo ya existente
r+ Texto, leer y escribir
rb Binario, leer solamente
wb Binario, escribir ( si existe un archivo con el mismo nombre este lo sobreescribe)
ab Binario, adjuntar el texto al archivo ya existente
rb+ Binario leer y escribir

Referencias:

https://www.freecodecamp.org/espanol/news/sentencias-try-y-except-de-python-como-menejar-excepciones-en-python/ https://www.w3schools.com/python/python_try_except.asp